library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity contador_programa is
   port (
    	Cp, Ep, CLK_neg, CLR_neg : in std_logic; -- neg significa negado (risco em cima)
   	saida                    : out std_logic_vector(3 downto 0):="ZZZZ"
   );   
end contador_programa;

architecture arquitetura of contador_programa is
   signal tmp_saida :  std_logic_vector(3 downto 0):="0000";   
   signal contador  :  std_logic_vector(3 downto 0):="0000";   

	begin
	
   	process (CLK_neg, Cp, contador)
   	begin
   		if (CLK_neg'event and CLK_neg = '0') then -- CLK negado igual a zero implica em mudanca de clock
	     		if (Cp = '1') then -- contador de programa habilitado p/ ler nova instrucao
   	      	if(contador="0000") then 
   	         	contador <= "0001";
   	      	elsif(contador="0001") then
   	         	contador<="0010";
   	      	elsif(contador="0010") then
   	         	contador<="0011";
   	      	elsif(contador="0011") then
   	         	contador<="0100";
   	      	elsif(contador="0100") then
   	         	contador<="0101";
   	      	elsif(contador="0101") then
   	         	contador<="0110";
   	      	elsif(contador="0110") then
   	         	contador<="0111";
   	      	elsif(contador="0111") then
   	         	contador<="1000";
   	      	elsif(contador="1000") then
   	         	contador<="1001";
   	      	elsif(contador="1001") then
   	         	contador<="1010";
   	      	elsif(contador="1010") then
   	         	contador<="1011";
   	      	elsif(contador="1011") then
   	         	contador<="1100";
   	      	elsif(contador="1100") then
   	      	   contador<="1101";
   	      	elsif(contador="1101") then
   	      	   contador<="1110";
   	      	elsif(contador="1110") then
   	      	   contador<="1111";
   	      	else
   	      	   contador<="0000";
   	      	end if;   
   	   	end if;
  	   	end if;
   	end process;

 		process (CLR_neg)
   	begin
      	if (CLR_neg'event) then
	    		if (CLR_neg = '0') then -- CLR negado igual a zero implica reset
		         contador <= "0000";
   	   	end if;
   	   end if;
	   end process;

	   process (CLK_neg,Ep)
   	begin
      	if (CLK_neg'event and CLK_neg = '0') then -- CLK negado igual a zero implica em mudanca de clock
	      	if (Ep = '1') then -- coloca o endereco no barramento W
   	      	tmp_saida <= contador;    
   	   	else
   	      	tmp_saida <= "ZZZZ";    
   	   	end if;
   	   	saida <= tmp_saida;
   	   end if;
   	end process;

end arquitetura;
